import zipfile
# zipfile自带的解压缩工具，无法将.apk文件详细解析
import subprocess
# subprocess，Python工具，能够调用Windows系统命令
# 这里调用Windows系统的java命令，使用apktool工具实现APK文件解析
import androguard
# Python第三方库，里面有强大的APK文件解析功能
# 这个好像下载起来比较麻烦，自己去找找资料下载


# APK 文件的路径
# Windows文件路径一定是双反斜杠，就是这个原因搞了我好久，其他地方问题应该不大
# 最好配置环境变量，就不需要设置path路径，避免额外修改
apk_path = "D:\\桌面\\涉诈APP\\APK测试文件\\测试apk.apk"

# 输出目录（不能预先存在）
output_dir = "D:\\桌面\涉诈APP\\APK测试文件\\Python解析apk"
# 你的apk绝对路径
apktool_path = "D:\\apktool\\apktool.bat"


# --------------------------------apktool工具解析--------------------------------------------

def use_apktool(apk_path, out_path, apktool_path):
    print("开始解析")
    try:
        # 运行 apktool 命令
        result = subprocess.run(
            [apktool_path, "d", apk_path, "-o", output_dir],
            check=True,
            capture_output=True,
            text=True,
        )
        print("反编译成功！")
        print("命令输出：", result.stdout)

    except subprocess.CalledProcessError as e:
        print("反编译失败。错误信息：", e.stderr)
    except FileNotFoundError:
        print("未找到 'apktool'。请确保已正确安装并在 PATH 中。")
    except Exception as ex:
        print("发生错误：", ex)







# --------------------------------------androguard工具用法-----------------------------------
# 相比于apktool androguard明显是一个更好的用于解析apk文件的库
# androguard是一个使用Python编写的解析apk文件的，里面包含大量的类，大量的方法
# 唯一的缺点是androguard无法像apktool一样将apk文件解析后便捷的保存在本地

# AnalyzeAPK只是众多中的一个
from androguard.misc import AnalyzeAPK
a, d, dx = AnalyzeAPK(apk_path)

# 获取三个对象a, d, dx
# a对象：它是APK文件的APK对象，包含了APK的基本信息，例如包名、版本号等。
# d对象：它是APK文件的DalvikVMFormat对象，用于表示APK的Dex文件。Dex文件包含了Android应用的字节码和相关信息。
# dx对象：它是APK文件的VMAnalysis对象，用于表示APK的Dalvik代码的静态分析结果。它包含了Dalvik字节码的控制流图、方法调用图等信息。


# =====================a对象==============================

print(a.get_permissions())
# 返回一个包含APK文件中声明的所有权限的列表。这个方法可以用来查看应用程序需要的权限，有助于了解应用的行为范围。
# a.get_permissions()获取xml文件中的所有权限(顺序打乱，不按xml中的顺序)

a.get_activities()
# a.get_activities()：返回一个包含APK文件中声明的所有Activity的列表。
# Activity是Android应用程序中的一个界面单元，该方法可以帮助你了解应用程序的界面结构。

a.get_package()
# a.get_package()：返回APK文件的包名。
# 包名是Android应用的唯一标识符，用于确保应用在设备上的唯一性。

a.get_app_name()
# a.get_app_name()：返回APK文件的应用名称。这个方法可以获取应用程序的用户可见名称，通常用于显示在设备屏幕上。
# 看这样子是要先预运行

a.get_app_icon()
# a.get_app_icon()：返回APK文件的应用图标。
# 这个方法可以获取应用程序的图标，通常用于显示在设备桌面上或应用列表中。
# 返回值'res/drawable-xxhdpi/icon.png'是一个路径

a.get_androidversion_code()
# a.get_androidversion_code()：返回APK文件的Android版本代码。这个版本代码是一个整数值，用于标识应用程序的Android版本。
# 通常，这个值在AndroidManifest.xml文件中的<manifest>元素中定义。
# apktool解析的xml中没有

a.get_androidversion_name()
# a.get_androidversion_name()：返回APK文件的Android版本名称。
# 这个版本名称是一个字符串，用于标识应用程序的人类可读版本。
# 这个1.5apktool解析的xml文件中也没有

a.get_android_manifest_axml().get_xml()
# a.get_android_manifest_axml().get_xml()：返回APK文件的AndroidManifest.xml的二进制XML（AXML）表示。
# AXML是AndroidManifest.xml的二进制版本，它需要解析才能被人类读懂。

a.get_android_manifest_xml()
# a.get_android_manifest_xml()：返回的是AndroidManifest.xml的ElementTree对象。

print("演示推送5")


# wogailedaima


# diercitest


# wanyushanxiugai
# ------------------------------------其他方式解析---------------------------------